package es.tikitaka.dao.impl;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.Query;

import org.jboss.seam.annotations.End;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;

import es.tikitaka.dao.UsuarioService;
import es.tikitaka.dictionary.MunicipioDic;
import es.tikitaka.dictionary.PerfilDic;
import es.tikitaka.dictionary.ProvinciaDic;
import es.tikitaka.domain.usuarios.Usuario;

/**
 * 
 * @author Saúl Domínguez
 * @since 2010
 * @category PFC
 */

@Name("usuarioService")
public class UsuarioServiceImpl implements UsuarioService {

	@In
	EntityManager em;

	/**
	 * Constructor por defecto
	 */
	public UsuarioServiceImpl() {
		// TODO Auto-generated constructor stub
	}

	/**
	 * 
	 * @return lista de todos los usuarios
	 */
	@SuppressWarnings("unchecked")
	public List<Usuario> getList() {
		List<Usuario> list = null;
		try {
			list = em.createQuery(
					"select u from Usuario u order by u.apellidos,u.nombre")
					.getResultList();
		} catch (RuntimeException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return list;
	}

	/**
	 * Método para comprobar si existe el nombre de usuario en la base de datos
	 * 
	 * @param username
	 *            nombre de usuario a comprobar
	 * @return true o false si existe el nombre de usuario o no
	 */
	@SuppressWarnings("unchecked")
	public boolean existeUsername(String username) {

		List<Usuario> list = null;
		try {
			list = em.createQuery(
					"select u from Usuario u where u.username = ?1")
					.setParameter("1", username).getResultList();

			if (list != null && list.size() > 0) {
				return true;
			} else {
				return false;
			}
		} catch (RuntimeException e) {
			e.printStackTrace();
		}
		return false;
	}

	/**
	 * 
	 * @param correo
	 *            Correo electrónico del usuario
	 * @return usuario Usuario al que pertenece el correo
	 */
	public Usuario getUsuario(String correo) {
		Usuario user = null;
		try {
			user = (Usuario) em
					.createQuery("from Usuario u where u.email = ?1")
					.setParameter("1", correo).getSingleResult();
		} catch (RuntimeException e) {
			e.printStackTrace();
		}
		return user;
	}

	/**
	 * Método para buscar en el sistema los usuarios que coinciden con los
	 * criterios de búsqueda
	 * 
	 * @param buscar
	 *            campo a buscar
	 * @param perfil
	 *            perfil a buscar
	 * @param provincia
	 *            provincia donde buscar
	 * @param municipio
	 *            municipio donde buscar
	 * @param s
	 *            String con la consulta
	 * @return lista de usuarios que coinciden con los criterios de búsqueda
	 */
	@SuppressWarnings("unchecked")
	public List<Usuario> buscar(String buscar, PerfilDic perfil,
			ProvinciaDic provincia, MunicipioDic municipio, StringBuffer s) {
		List<Usuario> lista = null;
		try {
			Query q = em.createQuery(s.toString());

			if (buscar != null && buscar.length() > 0) {
				q.setParameter("1", buscar);
			}
			if (perfil != null) {
				q.setParameter("2", perfil.getId());
			}
			if (provincia != null) {
				q.setParameter("3", provincia.getId());
			}
			if (municipio != null) {
				q.setParameter("4", municipio.getId());
			}

			lista = q.getResultList();
		} catch (RuntimeException e) {
			e.printStackTrace();
		}

		return lista;
	}

	/**
	 * 
	 * @param user
	 * @return
	 */
	public Usuario merge(Usuario user) {
		em.refresh(user);
		return em.merge(user);
	}

	/**
	 * 
	 * @param id
	 *            Id del usuario
	 * @return true o false si se borro correctamente o no
	 */
	public boolean delete(Integer id) {
		boolean correcto;
		try {
			Usuario user = em.getReference(Usuario.class, id);
			em.remove(user);
			em.flush();
			correcto = true;
		} catch (RuntimeException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			correcto = false;
		}
		return correcto;
	}

	/**
	 * 
	 * @param usuario
	 *            Usuario a guardar
	 * @return true o false si se guardo correctamente o no
	 */
	@End
	public boolean save(Usuario usuario) {
		boolean correcto;
		try {
			em.persist(usuario);
			em.flush();
			correcto = true;
		} catch (RuntimeException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			correcto = false;
		}
		return correcto;
	}

}
